/***
 * println! 打印的!号表示宏macro_rules里面定义的意思
 * use表示导入其他类库文件
 */
use std::cmp::Ordering;
use std::io;
use rand::Rng;

fn main() {
    println!("猜测游戏");

    //定义一个不可变的变量，而且从1到101随机生成的数字，但不包含101
    //此值的类型有u32,i32,i64
    let number = rand::thread_rng().gen_range(1..101);

    //循环体
    loop {

        //定义一个可变的参数(mut)
        let mut guess = String::new();

        //expect方法会返回一个枚举值，一个是OK与Erro的值，
        //pub enum Result<T, E>
        io::stdin().read_line(&mut guess).expect("无法读取行");

        //处理此输入的值，防止非法的输入,此值是一个隐藏u32类型值
        //注意:在Rust语言可以允许重复变量，此变量在这里是shadow
        let guess: u32 = match guess.trim().parse()
        {
            //OK就返回此数字
            Ok(num) => num,
            //错误就返回不处理
            Err(_) => continue,
        };

        //输出猜测的值
        print!("你猜的数字为：{}", guess);

        //使用match关键字做对比
        match guess.cmp(&number) {
            //Ordering是一个枚举
            Ordering::Less => print!("你猜的数字太小"),
            Ordering::Greater => print!("你猜的数字太大"),
            Ordering::Equal => {
                print!("恭喜你,你猜对了");
                //猜到就跳出loop循环体
                break;
            }
        }
    }
}
